import { ForbiddenError, SQLError, ServiceError, UnknownError } from '../utils/errors';
// 验证客户端的token
import { expressjwt } from 'express-jwt'
// 处理 session
import session from 'express-session'
import { JWT_SECRET } from './app.config';

/**
 * 输出请求地址
 */
export const requestUrl = (req, res, next) => {
  console.log(req.url);
  next();
}

/**
 * 验证 token
 * 请求的 header 中必须有 Authorization 属性，值为 Bearer token
 * 如果 token 无效，会抛出一个错误 
 * 如果 token 有效，还在 req 中添加 auth 属性存储 生成令牌是的第一个 data 参数
 */
export const parseTokenHandler = expressjwt({
  secret: JWT_SECRET, // 设置秘钥
  algorithms: ["HS256"], // 新版本 expressjwt 必须指定算法
}).unless({
  path: [
    {url: '/api', method: 'GET'},
    {url: '/api/admin/login', method: 'POST'},
    {url: '/api/admin/captcha', method: 'GET'},
    {url: '/api/blog', method: 'GET'}, // /api/blog?key=value
    {url: /\/api\/blog\/\w/, method: 'GET'}, // /api/blog/1
    {url: /\/api\/load\/\w/, method: 'GET'}, // /api/load/1
  ]
})

export const defaultErrorHandler = (err, req, res, next) => {
  // console.log('err.name >>>', err.name);
  // console.log('err.message >>>', err.message);
  console.log('err >>>', err);
  if (err.name === 'UnauthorizedError') {
    res.send(new ForbiddenError('未登录，或登录已过期').toResponseJSON())
  } else if (err instanceof ServiceError) {
    res.send(err.toResponseJSON())
  } else if (err['sql']) {
    res.send(new SQLError(err.sqlMessage).toResponseJSON())
  } else {
    res.send(new UnknownError().toResponseJSON())
  }
}

export const sessionHandler = session({
  secret: JWT_SECRET, // 与 jwt 相同就行
  resave: true,
  saveUninitialized: true
})